﻿// Importaciones requeridas para la Base de datos.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace CentroVentas.Clases
{
    class DataBase
    {

        // Modelo Singleton.
        /*
         *  Con este modelo nos aseguramos que una clase proporciona un único
         *  acceso globar a este objeto, esto resulta util para poder abrir solo una
         *  coneccion a la base de datos.
         *  
         * Mas referencia en: http://ant2e6.site11.com/Articulos/Programacion/Patrones-de-diseno/Patron-Singleton.htm
         */

        private static DataBase db = null; // Objeto Singleton
        public SqlDataAdapter dadap = null;
        public SqlConnection Conn;

        /// <summary>
        /// Devuelve o crea una instancia del objeto DataBase
        /// </summary>
        /// <returns>Objeto Database</returns>
         public static DataBase GetInstance()
        {
            // Comprobamos que el objeto no esté creado.
            if (db == null)
                db = new DataBase();

            db.conectar();
            // Devolvemos el objeto interno.
            return db;
        }
        
        public DataBase()
        {
            Conn = new SqlConnection(CentroVentas.Properties.Settings.Default.strConexion);
            dadap = new SqlDataAdapter();
        }

        /// <summary>
        /// Comprobare que:
        ///     - Exista el archivo de configuración.
        ///     - Que el servidor se pueda conectar.
        /// </summary>
        /// <returns></returns>
        public int comprobarIntegridad()
        {
            // Exista el archivo de configuración.
            if (!System.IO.File.Exists(System.Windows.Forms.Application.StartupPath + "\\CentroVentas.exe.config"))
            {
                return 0;                
            }
            else
            {
                if (this.conectar())
                {
                    return 1;
                }
                else
                {
                    return 2;
                }
            }
        }

        public bool conectar()
        {
            try
            {
                if (Conn.State != ConnectionState.Open)
                    Conn.Open();
                return true;
                
            }
            catch(Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                return false;
            }
        }

        public bool desconectar()
        {
            try
            {
                if (Conn.State == ConnectionState.Open)
                {
                    Conn.Close();
                    return true;
                }
                else
                {
                    return true;
                }                
            }
            catch
            {
                return false;
            }
        }

        private static bool existeParametro(string opcion){
            try
            {
                DataBase db = DataBase.GetInstance();
                DataSet ds = new DataSet();

                db.dadap.SelectCommand = new SqlCommand("SELECT COUNT(" + opcion + ") AS 'Cantidad' FROM options", db.Conn);
                db.dadap.Fill(ds, "c_options");

                if(Convert.ToInt32(ds.Tables["c_options"].Rows[0].ItemArray[0]) == 0) 
                    return true;
                return false;
            }
            catch (Exception ex)
            {
                Diagnostico.EventLogEntryType(System.Diagnostics.EventLogEntryType.Error, ex.Message + " // DataBase:existeParametro", 2);
                return false;
            }                    
        }

        internal object GetOpcion(string opcion)
        {
            try
            {
                if (existeParametro(opcion))
                {
                    DataBase db = DataBase.GetInstance();
                    DataSet ds = new DataSet();

                    db.dadap.SelectCommand = new SqlCommand("SELECT value_option FROM options WHERE key_option = @opcion", db.Conn);
                    db.dadap.SelectCommand.Parameters.Add(new SqlParameter("@opcion", SqlDbType.VarChar)).Value = opcion;
                    db.dadap.Fill(ds, "Opcion");
                    return ds.Tables["Opcion"].Rows[0].ItemArray[0];
                }
                else
                    return null;                
            }
            catch (Exception ex)
            {
                Diagnostico.EventLogEntryType(System.Diagnostics.EventLogEntryType.Error, ex.Message + " // DataBase:getOpcion", 1);
                return null;
            }
        }

        internal void SetOption(string key,string valor){
            try
            {
                if (existeParametro(key))
                {
                    DataBase db = DataBase.GetInstance();
                    db.dadap.InsertCommand = new SqlCommand("INSERT INTO options VALUES(@key,@valor)", db.Conn);
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@valor", SqlDbType.VarChar)).Value = valor;
                    db.dadap.InsertCommand.Parameters.Add(new SqlParameter("@key", SqlDbType.VarChar)).Value = key;
                    db.dadap.InsertCommand.ExecuteNonQuery();
                }
                else
                {
                    ActualizarParametro(key, valor);
                }
            }
            catch (Exception ex)
            {
                Diagnostico.EventLogEntryType(System.Diagnostics.EventLogEntryType.Error, ex.Message + " // DataBase:SetOption", 3);                
            }
        }

        private void ActualizarParametro(string key, string valor)
        {
            try
            {
                DataBase db = DataBase.GetInstance();
                db.dadap.UpdateCommand = new SqlCommand("UPDATE options SET value_option = @valor WHERE key_option = @key", db.Conn);
                db.dadap.UpdateCommand.Parameters.Add(new SqlParameter("@valor", SqlDbType.VarChar)).Value = valor;
                db.dadap.UpdateCommand.Parameters.Add(new SqlParameter("@key", SqlDbType.VarChar)).Value = key;
                db.dadap.UpdateCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Diagnostico.EventLogEntryType(System.Diagnostics.EventLogEntryType.Error, ex.Message + " // DataBase:SetOption", 3);
            }
        }

        public static List<string> GetDataBases()
        {
            try
            {
                DataSet ds = new DataSet();
                DataBase db = DataBase.GetInstance();
                db.dadap.SelectCommand = new SqlCommand("SELECT * FROM master.dbo.sysdatabases", db.Conn);
                db.dadap.Fill(ds,"BaseDatos");

                List<string> BaseDeDatos = new List<string>();
                foreach (DataRow dr in ds.Tables["BaseDatos"].Rows)
                {
                    BaseDeDatos.Add(dr["name"].ToString());
                }
                return BaseDeDatos;
            }
            catch (Exception ex)
            {
                Diagnostico.EventLogEntryType(System.Diagnostics.EventLogEntryType.Error, ex.Message + " // DataBase:GetDataBases", 3);                
                throw new Exception(ex.Message);
            }
        }
    }
}
